import { app, BrowserWindow, dialog, ipcMain, IpcMainEvent, globalShortcut, Menu } from 'electron'
import path, { resolve } from 'path'
import { createMenu, template } from '/@/utils/electron/menu.ts'
import { createTray } from '/@/utils/electron/tray'
import { WinEnum, DialogEnum, CustomEnum, CounterEnum } from '/@/enums/channelEnum'
import remote from '@electron/remote/main'
import Store from 'electron-store'
import fs from 'fs'
import { setupUpdater } from '/@/utils/electron/updater'
Store.initRenderer()

let win: BrowserWindow

// 屏蔽控制台的安全警告
process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'true'

const iconPath = path.join(__dirname, './images/icon.png')

const otherMenu = [
  {
    label: '运算',
    submenu: [
      {
        label: '增加',
        click: () => {
          win.webContents.send(CounterEnum.UPDATE, 1)
        }
      },
      {
        label: '减少',
        click: () => {
          win.webContents.send(CounterEnum.UPDATE, -1)
        }
      }
    ]
  }
]

const createWindow = () => {
  win = new BrowserWindow({
    title: 'my-electron-app',
    icon: iconPath,
    // 窗口是否置顶
    // alwaysOnTop: false,
    // 窗口大小
    width: 1280,
    height: 800,
    show: false,
    frame: true, // 是否显示窗口标题栏和边框，默认为 true
    webPreferences: {
      // 网页的同源策略，关闭后，可以调用第三方网站的服务端接口，不会出现跨域问题
      webSecurity: false,
      // 关闭进程隔离
      contextIsolation: false,
      // 集成 node 环境
      nodeIntegration: true
      // 预加载脚本
      // preload: resolve(__dirname, 'preload.js')
    }
    // 隐藏窗口的系统菜单，使用 Alt 键可以显示
    // autoHideMenuBar: true,
    // 隐藏标题栏和窗口
    // titleBarStyle: 'hidden',
    // 自定义标题栏时，设置系统窗口的按钮颜色
    // titleBarOverlay: {
    //   height: 40,
    //   color: '#ec4899',
    //   symbolColor: '#fff'
    // }
    // transparent: true // 设置窗口透明
  })

  // 窗口最大化
  // win.maximize()

  if (process.env.VITE_DEV_SERVER_URL) {
    win.loadURL(process.env.VITE_DEV_SERVER_URL)
  } else {
    win.loadFile('dist/index.html')
  }

  win.on('ready-to-show', () => {
    win.show()
  })

  // 打开开发工具
  win.webContents.openDevTools()

  // 移除菜单
  // Menu.setApplicationMenu(null)
  const menu = Menu.buildFromTemplate(template)
  Menu.setApplicationMenu(menu)
  // 创建菜单
  createMenu(template.concat(otherMenu))
  // 创建托盘
  createTray(win)
  // 检查应用更新
  setupUpdater(win)
  console.log('process.env:', process.versions.node)
}

// 设置窗口标题
const handleSetTitle = (event: IpcMainEvent, title: string) => {
  const webContents = event.sender
  const win = BrowserWindow.fromWebContents(webContents)
  win?.setTitle(title)
}

// 打开原生文件对话框，并返回文件路径 ipcMain.handle、ipcRender.invoke
const handleFileOpen = async () => {
  const { canceled, filePaths } = await dialog.showOpenDialog({})
  // if (!canceled) {
  //   return filePaths
  // }
  return filePaths
}

const handleFileOpen2 = () => {
  ipcMain.on(CustomEnum.OPEN, (event: IpcMainEvent, args: any) => {
    // console.log('event:', event)
    console.log('来自渲染进程的信息:', args)
    const filePaths = dialog.showOpenDialogSync({})
    event.reply(CustomEnum.REPLY, filePaths)
  })
}

const setDBPath = (dir: string, fileName: string) => {
  // 获取用户数据目录并设置数据存储路径
  let dbPath = 'file:' + resolve(app.getPath('userData'), dir, fileName)
  // 获取 .env 文件路径
  let envPath = resolve(process.cwd(), '.env')
  // 读取 .env 文件内容
  let envContent = fs.readFileSync(envPath, 'utf-8')
  // 替换以 DATABASE_URL 开头的变量
  let updateContent = envContent.replace(/DATABASE_URL=.*$/m, `DATABASE_URL=${dbPath}`)
  // 原始内容与更新后的内容不一致，则写入
  if (updateContent !== envContent) {
    fs.writeFileSync(envPath, updateContent)
  }
}

app.whenReady().then(() => {
  // setDBPath('db', 'dev.db')
  // 1.进程通信（渲染进程 -> 主进程） ipcMain.on、ipcRender.send
  // ipcMain.on(WinEnum.SETT_ITLE, handleSetTitle)
  // // 2.进程通信（渲染进程 <-> 主进程） ipcMain.handle、ipcRender.invoke
  // ipcMain.handle(DialogEnum.OPEN_FILE, handleFileOpen)
  // // 3.进程通信（渲染进程 <-> 主进程）ipcMain.on、IpcMAinEvent.reply、ipcRender.send、ipcRender.on
  // handleFileOpen2()
  // 创建窗口
  createWindow()

  // 使用 remote 模块
  remote.initialize()
  remote.enable(win.webContents)

  globalShortcut.register('F11', () => {
    return false
  })

  app.on('activate', () => {
    if (BrowserWindow.getAllWindows().length === 0) {
      createWindow()
    }
  })
})

// 关闭所有窗口时退出应用（windows、linux）
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') app.quit()
})
